/*
* 常见文件的mime类型
* html ------ text/html
* css ------- text/css
* js -------- text/javascript
* png ------- image/png
* jpg ------- image/jpeg
* gif ------- image/gif
* mp4 ------- video/mp4
* mp3 ------- audio/mpeg
* json ------ application/json
*
* 对于未知的资源类型可以使用 application/octet-stream 类型，浏览器会下载该文件
* */
const http = require('http')
const fs = require('fs')
const path = require('path')

const mimes = {
    html: 'text/html',
    css: 'text/css',
    js: 'text/javascript',
    png: 'image/png',
    jpg: 'image/jpeg',
    gif: 'image/gif',
    mp4: 'video/mp4',
    mp3: 'audio/mpeg',
    json: 'application/json'
}

const app = http.createServer((req, res) => {
    // 获取请求方法
    const method = req.method

    // 请求不是get请求曝“请求方法错误”
    if (method !== 'GET') {
        res.statusCode = 405
        res.end('<h2>405 Method Not Allowed</h2>')
        return
    }

    // 获取请求路径
    const {pathname} = new URL(req.url, 'http://127.0.0.1')

    const filePath = path.join(__dirname, `./file${pathname}`)

    fs.readFile(filePath, (err, data) => {
        if (err) {
            res.setHeader("Content-type", "text/html;charset=utf-8")
            switch (err.code) {
                case 'ENOENT':
                    res.statusCode = 404
                    res.end('<h2>404 Not Found</h2>>')
                    break
                case 'EPERM':
                    res.statusCode = 403
                    res.end('<h2>403 Forbidden</h2>>')
                    break
                default:
                    res.statusCode = 500
                    res.end('<h2>500 Internal Server Error</h2>>')
            }
            return
        }
        // 获取文件的后缀名
        const ext = path.extname(filePath).substring(1)
        // 获取mime类型
        const type = mimes[ext]
        if (type) {
            // 只给html文件设置charset=utf-8后，引用的资源都会按这个字符集解析
            if (ext === 'html') {
                // 响应头中设置的 charset=utf-8 优先级高于 html 中的 <meta charset="UTF-8">
                res.setHeader("Content-type", `${type};charset=utf-8`)
            } else {
                res.setHeader("Content-type", type)
            }
        } else {
            res.setHeader("Content-type", 'application/octet-stream')
        }
        res.end(data)
    })
})

app.listen(3000, () => {
    console.log('server is running...')
})

